Add an event_compression setting to GdkWindow
authorDaniel Sabo <DanielSabo@gmail.com>
Tue, 29 Oct 2013 21:43:05 +0000 (14:43 -0700)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 9 Nov 2013 05:01:05 +0000 (00:01 -0500)
Setting event compression to false will allow inter-frame
mouse motion events to be delivered, which are necessary
for painting applications to produce smooth strokes.

https://bugzilla.gnome.org/show_bug.cgi?id=702392

docs/reference/gdk/gdk3-sections.txt
gdk/gdkevents.c
gdk/gdkinternals.h
gdk/gdkwindow.c
gdk/gdkwindow.h

index dc0413d65fd91ce0d7d23a44188d15945687fa20..8652973a7669ec9647efc0c104bdbc37faa6d519 100644 (file)
@@ -491,6 +491,8 @@ gdk_window_get_device_events
 gdk_window_set_device_events
 gdk_window_get_source_events
 gdk_window_set_source_events
+gdk_window_get_event_compression
+gdk_window_set_event_compression
 
 <SUBSECTION>
 gdk_offscreen_window_get_surface
index e770f4777ba35bc9b36004f4f6a921104f6dcea4..6d926aef2c98019c29b767d0ed32611492a74809 100644 (file)
@@ -293,6 +293,9 @@ _gdk_event_queue_handle_motion_compression (GdkDisplay *display)
           pending_motion_device != event->event.motion.device)
         break;
 
+      if (!event->event.motion.window->event_compression)
+        break;
+
       pending_motion_window = event->event.motion.window;
       pending_motion_device = event->event.motion.device;
       pending_motions = tmp_list;
index 87d9941874c5c57557dae216fadbbebbcc8bb450..b2456662ecd39a75e8c03f6e7b29a09eb26aca59 100644 (file)
@@ -227,6 +227,7 @@ struct _GdkWindow
   guint applied_shape : 1;
   guint in_update : 1;
   guint geometry_dirty : 1;
+  guint event_compression : 1;
   GdkFullscreenMode fullscreen_mode;
 
   /* The GdkWindow that has the impl, ref:ed if another window.
index ee10901481f640f22b9e490fa39f877eed5a9163..8c121ed7411eda7928e32e7ee65c12059646e7d7 100644 (file)
@@ -1284,6 +1284,7 @@ gdk_window_new (GdkWindow     *parent,
 
   window->accept_focus = TRUE;
   window->focus_on_map = TRUE;
+  window->event_compression = TRUE;
 
   if (attributes_mask & GDK_WA_X)
     x = attributes->x;
@@ -9711,6 +9712,49 @@ gdk_window_set_focus_on_map (GdkWindow *window,
   GDK_WINDOW_IMPL_GET_CLASS (window->impl)->set_focus_on_map (window, focus_on_map);
 }
 
+/**
+ * gdk_window_set_event_compression:
+ * @window: a #GdkWindow
+ * @event_compression: %TRUE if motion events should be compressed
+ *
+ * Determines whether or not extra unprocessed motion events in
+ * the event queue can be discarded. If %TRUE only the most recent
+ * event will be delivered.
+ *
+ * Some types of applications, e.g. paint programs, need to see all
+ * motion events and will benefit from turning off event compression.
+ *
+ * By default, event compression is enabled.
+ *
+ * Since: 3.12
+ **/
+void
+gdk_window_set_event_compression (GdkWindow *window,
+                                  gboolean   event_compression)
+{
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  window->event_compression = event_compression;
+}
+
+/**
+ * gdk_window_get_event_compression:
+ * @window: a #GdkWindow
+ *
+ * Get the current event compression setting for this window.
+ *
+ * Return value: %TRUE if motion events will be compressed
+ *
+ * Since: 3.12
+ **/
+gboolean
+gdk_window_get_event_compression (GdkWindow *window)
+{
+  g_return_val_if_fail (GDK_IS_WINDOW (window), TRUE);
+
+  return window->event_compression;
+}
+
 /**
  * gdk_window_set_icon_list:
  * @window: The #GdkWindow toplevel window to set the icon of.
index de7872e4bb7cdef325dc99211cb75cbb3ea0e0b4..014f2f70e87c48c15ca886f46ccb59a4f051ceca 100644 (file)
@@ -1090,6 +1090,12 @@ GDK_AVAILABLE_IN_3_10
 void       gdk_window_set_opaque_region        (GdkWindow      *window,
                                                 cairo_region_t *region);
 
+GDK_AVAILABLE_IN_3_12
+void       gdk_window_set_event_compression    (GdkWindow      *window,
+                                                gboolean        event_compression);
+GDK_AVAILABLE_IN_3_12
+gboolean   gdk_window_get_event_compression    (GdkWindow      *window);
+
 G_END_DECLS
 
 #endif /* __GDK_WINDOW_H__ */